﻿using System;
using System.Collections.Generic;
using System.Text;
using SistemaLib.sipe.db.sqlserver;
using SistemaLib.Entidades;
using SistemaLib.sipe.db.general;
using SistemaLib.sipe.util;
using System.Data;

namespace SistemaLib.Persistencia
{
    public class DbTarea : DbBase
    {
        private void Cargar(DataRow fila, Tarea obj)
        {
            obj.Id = ObtieneCampo.TipoInt(fila, "id");
            obj.Nombre = ObtieneCampo.TipoString(fila, "nombre");
            obj.Descripcion = ObtieneCampo.TipoString(fila, "descripcion");
            obj.fechaCreacion = ObtieneCampo.TipoFecha(fila, "fechaCreacion");
            obj.IdComplejidad = ObtieneCampo.TipoInt(fila, "idComplejidad");
            obj.IdConocimientosRequeridos = ObtieneCampo.TipoInt(fila, "idConocimientos");
            obj.IdPrioridad = ObtieneCampo.TipoInt(fila, "idPrioridad");
            obj.IdEstado = ObtieneCampo.TipoInt(fila, "idEstado");
            obj.IdTipo = ObtieneCampo.TipoInt(fila, "idTipo");
            obj.IdProyecto = ObtieneCampo.TipoInt(fila, "idProyecto");
            obj.IdPerfilRequerido = ObtieneCampo.TipoInt(fila, "idPerfilRequerido");
            obj.IdSeniorityRequerido = ObtieneCampo.TipoInt(fila, "idSeniorityRequerido");
        }

        private void Cargar(DataRow fila, TareaToShow obj)
        {
            obj.Id = ObtieneCampo.TipoInt(fila, "id");
            obj.Nombre = ObtieneCampo.TipoString(fila, "nombre");
            obj.Descripcion = ObtieneCampo.TipoString(fila, "descripcion");
            obj.fechaCreacion = ObtieneCampo.TipoFecha(fila, "fechaCreacion");
            obj.Complejidad = ObtieneCampo.TipoString(fila, "complejidad");
            obj.Prioridad = ObtieneCampo.TipoString(fila, "prioridad");
            obj.Estado = ObtieneCampo.TipoString(fila, "estado");
            obj.Tipo = ObtieneCampo.TipoString(fila, "tipo");
            obj.Proyecto = ObtieneCampo.TipoString(fila, "proyecto");
            obj.PerfilRequerido = ObtieneCampo.TipoString(fila, "perfil");
            obj.SeniorityRequerido = ObtieneCampo.TipoString(fila, "seniority");
        }

        public Tarea CargarTareaPorId(int idTarea)
        {
            Tarea obj = new Tarea();

            string sql = @"select * from Tareas where id = @idTarea";

            DataSet ds;

            DbParameterCollection col = new DbParameterCollection();
            col.Add(DbConnection.SqlInputParam("@idTarea", DbTipo.Entero, 0, idTarea));

            this.DbConnection.RunDataSetProcedure(sql, col, CommandType.Text, out ds);

            if (ds != null && ds.Tables[0].Rows.Count > 0)
            {
                DataRow fila = ds.Tables[0].Rows[0];
                Cargar(fila, obj);
            }

            return obj;
        }

        public TareaToShow CargarTareaToShow(int idTarea)
        {
            TareaToShow obj = new TareaToShow();

            string sql = @"	SELECT 
		                        t.id,
		                        t.nombre,
		                        t.descripcion,
		                        t.fechaCreacion,
		                        tc.descripcion as complejidad, 
		                        tp.descripcion as prioridad,
		                        tt.descripcion as tipo,
		                        te.descripcion as estado,
		                        p.descripcion as perfil,
		                        s.descripcion as seniority,
		                        pr.nombre as proyecto
                            FROM Tareas t
                                JOIN TareasComplejidades tc on tc.id = t.idComplejidad
                                JOIN TareasPrioridades tp on tp.id = t.idPrioridad
                                JOIN TareasEstados te on te.id = t.idEstado
                                JOIN TareasTipos tt on tt.id = t.idTipo
                                JOIN Seniorities s on s.id = t.idSeniorityRequerido
                                JOIN Perfiles p on p.id = t.idPerfilRequerido
                                JOIN Proyectos pr on pr.id = t.idProyecto
                            WHERE t.id = @idTarea";

            DataSet ds;

            DbParameterCollection col = new DbParameterCollection();
            col.Add(DbConnection.SqlInputParam("@idTarea", DbTipo.Entero, 0, idTarea));

            this.DbConnection.RunDataSetProcedure(sql, col, CommandType.Text, out ds);

            if (ds != null && ds.Tables[0].Rows.Count > 0)
            {
                DataRow fila = ds.Tables[0].Rows[0];
                Cargar(fila, obj);
            }

            return obj;
        }

        public DataSet ListarTareas()
        {
            string sql = @"ListarTareas";

            DataSet ds;

            this.DbConnection.RunDataSetProcedure(sql, CommandType.StoredProcedure, out ds);

            return ds;
        }            
        
        private void Agregar(Tarea tar)
        {
            DbScriptGenerator sql = new DbScriptGenerator();

            sql.Tabla = "Tareas";
            sql.addCampo("nombre");
            sql.addCampo("descripcion");
            sql.addCampo("fechaCreacion");
            sql.addCampo("idComplejidad");
            sql.addCampo("idConocimientos");
            sql.addCampo("idPrioridad");
            sql.addCampo("idEstado");
            sql.addCampo("idTipo");
            sql.addCampo("idProyecto");
            sql.addCampo("idPerfilRequerido");
            sql.addCampo("idSeniorityRequerido");


            DbParameterCollection col = new DbParameterCollection();
            col.Add(DbConnection.SqlInputParam("@nombre", DbTipo.Cadena, 0, tar.Nombre));
            col.Add(DbConnection.SqlInputParam("@descripcion", DbTipo.Cadena, 0, tar.Descripcion));
            col.Add(DbConnection.SqlInputParam("@fechaCreacion", DbTipo.Fecha, 0, tar.fechaCreacion));
            col.Add(DbConnection.SqlInputParam("@idComplejidad", DbTipo.Entero, 0, tar.IdComplejidad));
            col.Add(DbConnection.SqlInputParam("@idConocimientos", DbTipo.Entero, 0, tar.IdConocimientosRequeridos));
            col.Add(DbConnection.SqlInputParam("@idPrioridad", DbTipo.Entero, 0, tar.IdPrioridad));
            col.Add(DbConnection.SqlInputParam("@idEstado", DbTipo.Entero, 0, tar.IdEstado));
            col.Add(DbConnection.SqlInputParam("@idTipo", DbTipo.Entero, 0, tar.IdTipo));
            col.Add(DbConnection.SqlInputParam("@idProyecto", DbTipo.Entero, 0, 1)); //tar.IdProyecto)); SACAR EL 1 HARDCODEADO
            col.Add(DbConnection.SqlInputParam("@idPerfilRequerido", DbTipo.Entero, 0, tar.IdPerfilRequerido));
            col.Add(DbConnection.SqlInputParam("@idSeniorityRequerido", DbTipo.Entero, 0, tar.IdSeniorityRequerido));


            object id;
            this.DbConnection.RunScalarProcedure(sql.getInsert(), col, CommandType.Text, out id);

            tar.Id = int.Parse(id.ToString());
        }

        private void Modificar(Tarea tar)
        {
            DbScriptGenerator sql = new DbScriptGenerator();

            sql.Tabla = "Tareas";
            sql.CampoClave = "id";
            sql.addCampo("nombre");
            sql.addCampo("descripcion");
            sql.addCampo("fechaCreacion");
            sql.addCampo("idComplejidad");
            sql.addCampo("idConocimientos");
            sql.addCampo("idPrioridad");
            sql.addCampo("idEstado");
            sql.addCampo("idTipo");
            sql.addCampo("idProyecto");
            sql.addCampo("idPerfilRequerido");
            sql.addCampo("idSeniorityRequerido");

            DbParameterCollection col = new DbParameterCollection();
            col.Add(DbConnection.SqlInputParam("@id", DbTipo.Entero, 0, tar.Id));
            col.Add(DbConnection.SqlInputParam("@nombre", DbTipo.Cadena, 0, tar.Nombre));
            col.Add(DbConnection.SqlInputParam("@descripcion", DbTipo.Cadena, 0, tar.Descripcion));
            col.Add(DbConnection.SqlInputParam("@fechaCreacion", DbTipo.Fecha, 0, tar.fechaCreacion));
            col.Add(DbConnection.SqlInputParam("@idComplejidad", DbTipo.Entero, 0, tar.IdComplejidad));
            col.Add(DbConnection.SqlInputParam("@idConocimientos", DbTipo.Entero, 0, tar.IdConocimientosRequeridos));
            col.Add(DbConnection.SqlInputParam("@idPrioridad", DbTipo.Entero, 0, tar.IdPrioridad));
            col.Add(DbConnection.SqlInputParam("@idEstado", DbTipo.Entero, 0, tar.IdEstado));
            col.Add(DbConnection.SqlInputParam("@idTipo", DbTipo.Entero, 0, tar.IdTipo));
            col.Add(DbConnection.SqlInputParam("@idProyecto", DbTipo.Entero, 0, tar.IdProyecto));
            col.Add(DbConnection.SqlInputParam("@idPerfilRequerido", DbTipo.Entero, 0, tar.IdPerfilRequerido));
            col.Add(DbConnection.SqlInputParam("@idSeniorityRequerido", DbTipo.Entero, 0, tar.IdSeniorityRequerido));
            int id;
            this.DbConnection.RunNonQueryProcedure(sql.getUpdate(), col, CommandType.Text, out id);
        }

        internal void Eliminar(int idTarea)
        {
            string sql = "delete from Tareas where id = @id";

            DbParameterCollection col = new DbParameterCollection();
            col.Add(DbConnection.SqlInputParam("@id", DbTipo.Entero, 0, idTarea));

            int cant;
            this.DbConnection.RunNonQueryProcedure(sql, col, CommandType.Text, out cant);
        }

        internal void Guardar(Tarea tarea)
        {
            if (tarea.Id == 0)
                Agregar(tarea);
            else
                Modificar(tarea);
        }

        
    }
}
